<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"/>
<title>内置的服务类</title><link href="../zdoc.css" rel="stylesheet" type="text/css"/><link href="../_rs/site.css" rel="stylesheet" type="text/css"/><script src="../_rs/jquery.js" language="Javascript"></script><script src="../_rs/site.js" language="Javascript"></script><script src="../_rs/z.js" language="Javascript"></script>
</head>
<body><a name="top"></a>
<div class="zdoc_header">内置的服务类</div>
<div class="zdoc_author"><em>By:</em><b>zozoh</b><a href="mailto:zozohtnt@gmail.com">&lt;zozohtnt@gmail.com&gt;</a></div>
<div class="zdoc_body">
<ul class="zdoc_index_table">
<li>
<div><span class="num">1</span><a href="#什么是服务类，为什么需要它">什么是服务类，为什么需要它</a></div>
</li>
<li>
<div><span class="num">2</span><a href="#Nutz_内置的服务类">Nutz 内置的服务类</a></div>
</li>
<li>
<div><span class="num">3</span><a href="#关于服务类的总结">关于服务类的总结</a></div>
</li>
</ul>
<p></p>
<div class="hr"><b></b></div>
<h1><a name="什么是服务类，为什么需要它"></a>什么是服务类，为什么需要它</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p><a href="https://github.com/nutzam/nutz/blob/master/src/org/nutz/dao/Dao.java">Nutz.Dao 接口</a>可以针对任何 POJO 的进行操作。因为是通用的 Dao 操作，所以多数接口函数都需要一个参数类说明 POJO 的类型，比如：</p>
<pre>Pet pet = dao.fetch(Pet.class,"XiaoBai");
</pre>
<p>单独的调用一行接口，多传入一个参数到没什么，但是如果频繁的被使用，每次都要多写一个参数毕竟很是麻烦。为此我又提供一层非常简单的针对 <a href="https://github.com/nutzam/nutz/blob/master/src/org/nutz/dao/Dao.java">org.nutz.dao.Dao</a> 接口的封装。譬如：</p>
<pre>IdNameEntityService&lt;Pet&gt; pets = new IdNameEntityService&lt;Pet&gt;(dao){};
Pet pet = pets.fetch("XiaoBai");
</pre>
<p>这样，调用的时候，就不用每次都传入参数了。</p>
<p>当然服务类并不是强制你使用的，只不过多数时候，采用 Nutz 提供的服务类会比较方便。你可以从 org.nutz.service.Service 继承自己的服务类，或者你干脆重新建立自己的服务类（提供更多的数据操作方法，进行 Crud 操作），因为 <a href="https://github.com/nutzam/nutz/blob/master/src/org/nutz/service/Service.java">org.nutz.service.Service</a>并不复杂，所以你是否从中继承你自己的类对你的代码影响不大。你可以参考它的源代码。</p>
<div class="hr"><b></b></div>
<h1><a name="Nutz_内置的服务类"></a>Nutz 内置的服务类</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>在包 <a href="https://github.com/nutzam/nutz/tree/master/src/org/nutz/service">Service</a> 中，提供了一些实现：</p>
<p><img src="hierarchy_services.png"/></p>
<p>请重新温习一下<a href="services.html">Nutz.Dao 实体注解(Entity Annotation)</a>中的注解 <span style="color:#AA6644;"><b>@Id</b></span> 和 <span style="color:#AA6644;"><b>@Name</b></span> 这两个注解，这里我称一个 POJO 对象为一个 <span style="color:#0000AA;"><b>实体</b></span> （<span style="color:#008800;">Entity</span>）：</p>
<ul type="disc">
<li>如果 POJO 即声明了 <span style="color:#AA6644;"><b>@Id</b></span> 又声明了 <span style="color:#AA6644;"><b>@Name</b></span>，那么适合采用 IdNameEntityService</li>
<li>如果 POJO 仅声明了 <span style="color:#AA6644;"><b>@Id</b></span>，那么适合采用 IdEntityService</li>
<li>如果 POJO 仅声明了 <span style="color:#AA6644;"><b>@Name</b></span>，那么适合采用 NameEntityService</li>
<li>如果 POJO 即没声明了 <span style="color:#AA6644;"><b>@Id</b></span> 又没声明了 <span style="color:#AA6644;"><b>@Name</b></span>，那么适合采用 EntityService</li>
</ul>
<h1><a name="关于服务类的总结"></a>关于服务类的总结</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<ul type="disc">
<li>这四个内置的服务类，仅仅提供了一些基本的操作。</li>
<li>这些服务类都是支持泛型。</li>
<li>你可以直接使用，或者你可以从这四个服务类继承你自己的实现。</li>
<li>如果你继承这些服务类,请务必声明泛型</li>
</ul>
<p>正确的写法</p>
<pre>	public class RegisterService extends IdEntityService&lt;UserBean&gt; {
		public RegisterService(Dao dao){
			super(dao);
		}
	}
</pre>
<p>错误的写法,你在log中会看到一条警告信息.</p>
<pre> 	public class RegisterService extends IdEntityService {
 		public RegisterService(Dao dao){
 			super(dao);
 		}
 	}
</pre>
<p>即，你的 Service 必须通过模板参数，告诉自己的父类，自己要操作的 POJO 类是什么，否则父类会很茫然的</p>
</div>
<div class="zdoc_footer"><em>By:</em><b>zozoh</b><a href="mailto:zozohtnt@gmail.com">&lt;zozohtnt@gmail.com&gt;</a></div>
</body>
</html>